package com.cskaoyan.javse.oop2._1extends._10final._3variable._2member;

/**
 * final成员变量,表示一个成员常量,它仍然存储在对象当中,它的赋值方式还是那些
 * 语法: [访问权限修饰符] final 数据类型 变量;
 *
 * 直接写语法声明final成员常量,会编译报错,这说明默认值不能作为成员常量的值,而是必须明确的(在创建对象过程中)给出一个值,那么赋值的方式:
 *      1.显式赋值
 *      2.构造器赋值
 *      3.构造代码块赋值
 * 以上三种方式,必须选择一种,而且也只能选择一种,因为它是常量,必须且只能赋值一次.
 * 需要注意,如果选择构造器赋值,必须所有的构造器,都能给常量赋值,少一个都不行
 *
 * 思考: 我们的final修饰的成员变量,是不是一个真正意义上的常量呢?
 * 不算,每创建一个对象,它的值都可能不同,不是真正意义上的常量,只是对于某个对象来说,它是常量.
 * 如果想要真正意义上的常量,咋办?
 * 只需要使用final修饰静态成员变量,那么在类的全局只有一份,是真正意义上的常量.所以final修饰静态成员变量,实际开发中更常见.
 *
 * @since 16:03
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        Student s = new Student(200);
        Student s2 = new Student(100);
        // s.age = 100;
    }
}

class Student {
    // Variable 'age' might not have been initialized
    final int age;

    {
        // age = 100;
    }

    public Student(int age) {
        this.age = age;
    }

    // 思考: 直接添加默认无参可以吗?
    public Student() {
        age = 100;
    }
}
